package com.ultimate.management.util;

import com.ultimate.management.entity.SysMenu;
import com.ultimate.management.entity.vue.RouterVo;
import org.springframework.beans.BeanUtils;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.Optional;

/**
 * @Author LH
 * @Date 2024/2/26 18:36
 * @PackageName com.ultimate.management.util
 * @Description: 解析菜单  ->  菜单树
 */
public class MenuTree {

    public static List<RouterVo> makeRouter(List<SysMenu> menuList, Long pid) {

        //创建路由集合列表
        //创建路由列表
        List<RouterVo> routerList = new ArrayList<>();

        //如果传入的menuList菜单列表不为空,则使用菜单列表,否则创建集合对象
        Optional.ofNullable(menuList).orElse(new ArrayList<SysMenu>())
                //筛选不为空的菜单以及 菜单父级匹配指定pid
                .stream().filter(item -> item != null && item.getParentId() == pid)
                .forEach(item -> {
                    RouterVo routerVo = new RouterVo();
                    routerVo.setName(item.getName());//路由名称
                    routerVo.setPath(item.getUrl());//设置路由路径

                    //判断是否为以及菜单
                    if (item.getParentId() == 0L) {
                        routerVo.setComponet("Layout");//一级菜单组件
                        routerVo.setAlwaysShow(true);
                    } else {
                        routerVo.setComponet(item.getUrl());//具体的组件
                        routerVo.setAlwaysShow(false);//折叠路由
                    }
                    //设置meta信息
                    routerVo.setMeta(routerVo.new Meta(item.getLabel()
                            , item.getIcon()
                            , item.getPerms().split(",")));

                    //递归生成子路由
                    List<RouterVo> children = makeRouter(menuList, item.getMenuId());
                    routerVo.setChildren(children);//设置子路由到路由对象中
                    //将路由信息添加到集合中
                    routerList.add(routerVo);
                });
        return routerList;
    }


    //生成菜单树
    public static List<SysMenu> makeMenuTree(List<SysMenu> menuList,Long pid){
        //创建集合菜单
        List<SysMenu> list = new ArrayList<>();
        //如果menulist不为空则用自己,否则创建新的
        Optional.ofNullable(menuList).orElse(new ArrayList<SysMenu>())
                .stream().filter(item -> item != null &&
                        Objects.equals(item.getParentId(),pid))
                .forEach(item -> {
                    //创建菜单权限对象
                    SysMenu sysMenu = new SysMenu();
                    //复制属性
                    BeanUtils.copyProperties(item,sysMenu);
                    //获取每个item的下级菜单,递归生成菜单树
                    List<SysMenu> children = makeMenuTree(menuList,item.getMenuId());
                    //设置子菜单
                    sysMenu.setMenuList(children);
                    //将菜单对象添加到集合中
                    list.add(sysMenu);
                });
        return list;
    }

}
